package com.wuzhazha.redisdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;

import java.util.List;

/**
 * @Author:wuzhazha
 * @Date: 2018/8/12 10:16
 * @Description:
 */
public class RedisTemplateServiceImpl implements RedisTemplateService {

    @Autowired
    private RedisTemplate redisTemplate;


    /**
     * 使用sessionCallback接口让多个命令在一个redis连接中执行
     */
    @Override
    public void execMultiCommand() {
        redisTemplate.execute(new SessionCallback() {
            @Override
            public Object execute(RedisOperations ops) throws DataAccessException {
                ops.boundValueOps("key1").set("abc");
                ops.boundHashOps("hash").put("hash-key-1","hash-value-1");
                Object key1 = ops.boundValueOps("key1").get();
                System.out.println(key1);
                return key1;
            }
        });
    }

    /**
     * 使用sessionCallback接口实现事务在一个redis连接中执行
     */
    @Override
    public void execTransaction() {
        redisTemplate.execute(new SessionCallback() {
            @Override
            public Object execute(RedisOperations ops) throws DataAccessException {
                //监控
                ops.watch("key1");
                //开启事务
                ops.multi();
                //注意，命令都不会马上执行，只会放到redis队列，只会返回null
                ops.boundValueOps("key1").set("abc");
                ops.boundHashOps("hash").put("hash-key-1","hash-value-1");
                Object key1 = ops.boundValueOps("key1").get();
                System.out.println(key1);
                //执行exec方法后会触发事务执行，返回结果，放到list中
                List list = ops.exec();
                System.out.println(list);
                return list;
            }
        });
    }

    /**
     * 执行流水线，将多个命令一次性发送给redis服务器
     */
    @Override
    public void execPipeline() {
        //使用匿名类实现
        List list = redisTemplate.executePipelined(new SessionCallback() {

            @Override
            public Object execute(RedisOperations ops) throws DataAccessException {
                //在流水线下不会马上返回结果，结果是一次性执行后返回的
                ops.boundValueOps("key1").set("abc");
                ops.boundHashOps("hash").put("hash-key-1", "hash-value-1");
                ops.boundValueOps("key1").get();
                return null;
            }
        });
        System.out.println(list);
    }
}
